#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <mysql/mysql.h>

#include "../inc/tcp.h"

// MySQL配置
const char *DB_SERVER = "localhost";
const char *DB_USER = "root";
const char *DB_PWD = "";
const char *DB_NAME = "userdb"; // 数据库名

/**
 * 初始化数据库连接
 */
MYSQL *db_init()
{
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL)
    {
        printf("[DB] 初始化失败！\n");
        return NULL;
    }

    // 1. 启用自动重连（增强稳定性）
    _Bool  reconnect = 1;
    mysql_options(conn, MYSQL_OPT_RECONNECT, &reconnect);

    // 2. 设置字符集（utf8mb4 支持所有 Unicode 字符）
    mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8mb4");

    // 3. 连接数据库（指定默认数据库 DB_NAME）
    if (mysql_real_connect(conn, DB_SERVER, DB_USER, DB_PWD, DB_NAME,
                           3306, NULL, 0) == NULL)
    {
        printf("[DB] 连接失败: %s\n", mysql_error(conn));
        mysql_close(conn);
        return NULL;
    }

    // 4. 关键步骤：显式切换到目标数据库（确保上下文正确）
    char use_db_sql[64] = {0};
    snprintf(use_db_sql, sizeof(use_db_sql), "USE %s", DB_NAME);
    if (mysql_query(conn, use_db_sql) != 0)
    {
        printf("[DB] 切换到数据库 %s 失败: %s\n", DB_NAME, mysql_error(conn));
        mysql_close(conn);
        return NULL;
    }

    printf("[DB] 连接并切换到数据库 %s 成功\n", DB_NAME);
    return conn;
}

int mysql_check_and_reconnect(MYSQL **conn)
{
    if (*conn == NULL)
    {
        // 连接为空，直接重新初始化
        *conn = db_init();
        return (*conn == NULL) ? 1 : 0;
    }

    // 用mysql_ping检查连接：成功=连接有效，失败=连接失效
    if (mysql_ping(*conn) == 0)
    {
        return 0; // 连接有效，无需处理
    }

    // 连接失效，关闭旧连接并重新建立
    printf("[DB] 连接已失效，尝试重连...\n");
    mysql_close(*conn);
    *conn = db_init();

    if (*conn == NULL)
    {
        printf("[DB] 重连失败！\n");
        return 1;
    }
    printf("[DB] 重连成功！\n");
    return 0;
}